#include<iostream>
#include<unistd.h>
#include<pthread.h>
#include<cstring>
#include<unistd.h>
#include<thread>

int gmun = 100;






//转16进制
std::string zhh(pthread_t tid)
{
    //4.进程内的函数，线程共享
     char buff[64];
     snprintf(buff,sizeof(buff),"0x%lx",tid);
     return buff;
}

// void* run2(void* args)
// {
//     std::string name = static_cast<const char*>(args);
//     while(true)
//     {
//         std::cout << "我是新线程,名称是:" << name <<"新线程的tid:"<< zhh(pthread_self()) << "全局变量(检测):" << gmun << std::endl;
//         //全局变量++
//         gmun++;
//         sleep(1);
//         int* p= nullptr;
//         *p = 100;
//     }
//     return 0;
// }

class thrdata
{
public:
    thrdata(const std::string& name, int a, int b) : _name(name), _a(a), _b(b) {
    }

    int jia() {
        return _a + _b;
    }

    std::string Name() {
        return _name;
    }

    ~thrdata() {
    }


private:
    std::string _name;
    int _a;
    int _b;
};


void* run(void* args)
{
    //std::string name = static_cast<const char*>(args);
    thrdata *td = static_cast<thrdata *>(args);

    while(true)
    {
        
        std::cout << "我是新线程,名称是:" << td->Name() <<"新线程的tid:"<< zhh(pthread_self()) << "全局变量(修改):" << gmun << std::endl;

        std::cout << "结果:" << td->jia() << std::endl;

        //全局变量++
        gmun++;
        sleep(5);
        //5秒后退出
        break;
    }
    return 0;
}

int main()
{
    pthread_t tid1;
    thrdata *td = new thrdata("run-1",10,20);
    pthread_create(&tid1,nullptr,run,td);

    //阻塞等待新线程
    int n = pthread_join(tid1,nullptr);
    if(n != 0)//不等于0错误
    {
        std::cerr << "error:" <<n << " , " << strerror(n) << std::endl;
    }
    std::cout << "回收新线程成功" << std::endl;

    // pthread_t tid2;
    // pthread_create(&tid2,nullptr,run2,(void*)"run-2");

    // // pthread_t tid3;
    // // pthread_create(&tid3,nullptr,run,(void*)"run-3");

    // // pthread_t tid4;
    // // pthread_create(&tid4,nullptr,run,(void*)"run-4");
      
    // //std::cout << "线程tid:" << tid << std::endl;
    // printf("线程tid: 0x%lx\n",tid1);
    // while(true)
    // {
    //     std::cout << "我是main线程" << std::endl;
    //     sleep(1);
    // }
    // return 0;
}














// void* run(void* args)
// {
//     std::string name = static_cast<const char*>(args);//名称转换成字符串类型
//     while(true)
//     {
//         std::cout << "我是新线程，我的名称是：" <<name << std::endl;
//         sleep(1);
//     }
//     return 0;
// }

// int main()
// {
//     pthread_t tid;
//     int n = pthread_create(&tid,nullptr,run,(void*)"run-1");
//     if(n != 0)//不等于0，错误打印错误码
//     {
//         std::cout << "error:" << strerror(n) << std::endl;
//         return 1;
//     }

//     while(true)
//     {
//         std::cout << "我是main线程...." << std::endl;
//         sleep(1);
//     }
//     return 0;
// }



// std::thread t([](){
//     while(true)
//     {
//         std::cout << "我是新线程"  << std::endl;
//         sleep(1);
//     }
// });

// while(true)
// {
//     std::cout << "我是主线程"  << std::endl;
//     sleep(1);
// }







// //新线程
// void* run(void* args)
// {
//     while(true)
//     {
//         std::cout << "新线程 , pid:"<< getpid() << std::endl;
//         sleep(1);
//     }
//     return nullptr;
// }

// int main()
// {
//     std::cout << "我是一个进程我的pid：" << getpid() << std::endl;
    
//     pthread_t tid;//线程id
//     //创建线程
//     pthread_create(&tid,nullptr,run,(void*)"thr-1");//线程名称是thr-1，

//     //主线程
//     while(true)
//     {
//         std::cout << "主线程,pid:" << getpid() << std::endl;
//         sleep(1);
//     }
//     return 0;
// }